classdef FIR_filter < handle
    %UNTITLED2 此处显示有关此类的摘要
    %   此处显示详细说明

    properties
        data;
        h;
        filtered_data;
    end

    methods
        function obj = FIR_filter(fp,fs,ap,as,samp_fre)
            %UNTITLED2 构造此类的实例
            %   此处显示详细说明
            obj.h = designFIRfilter(obj,fp,fs,ap,as,samp_fre);
        end

        function h = designFIRfilter(obj,fp,fs,ap,as,samp_fre)
            % 通带截止频率，阻带截止频率，通带衰减（暂时无用），阻带衰减（暂时无用），采样频率
            % 通过频率参数（模拟）计算数字参数
            wp = 2*pi*fp/samp_fre;
            ws = 2*pi*fs/samp_fre;
            wc = (wp + ws)/2/pi;
            % 过渡带宽度
            B = wp - ws;
            % 使用布莱克曼窗，满足指标所需要到阶数
            N = abs(ceil(6.6*pi/B));
            % 使用函数实现标准的滤波器
            h = fir1(N,wc,blackman(N+1));
        end
        
        function result = apply_filter(obj,data)
            obj.data = data; 
            obj.filtered_data = filter(obj.h,1,data);
            result = obj.filtered_data;
        end

        function draw_plot(obj)
            % 绘制窗函数
            subplot(3, 1, 1);
            stem(obj.h);
            title('布莱克曼窗');
            
            % 绘制原始数据
            subplot(3, 1, 2);
            plot(obj.data);
            title('原始数据');

            % 绘制滤波之后的数据
            subplot(3, 1, 3);
            plot(obj.filtered_data);
            title('滤波之后的数据');
        end
    end
end